#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>


#define NUM 1024
#define SIZE 12
#define SEP " "

//保存完整的命令行输入 记得处理\n
char cmd_line[NUM];

//保存chai
char *cmd[SIZE];

// 保存环境变量
char envp[NUM];

int main()
{
    while(1)
    {

        //1 打印 每一行的信息
        printf("[Mantax@MA-2-14-centos ex]# ");
        fflush(stdout);

        //2 获取输入信息
        memset(cmd_line,'\0',sizeof cmd_line);

        if(fgets(cmd_line,sizeof cmd_line,stdin)==NULL)
        {
           continue;
        }
        //去除\n
        cmd_line[strlen(cmd_line)-1]='\0';
        //划分 字符串
        cmd[0]=strtok(cmd_line,SEP); //SEP 为空格

        int index=1;
        //处理特殊情况
        if(strcmp(cmd[0],"ls")==0) 
        {
            cmd[index++]=(char*)"--color=auto";
        }
        if(strcmp(cmd[0],"ll")==0) 
        {
            cmd[0]=(char*)"ls";
            cmd[index++]=(char*)"-l";
            cmd[index++]=(char*)"--color=auto";
        }

        while(cmd[index++]=strtok(NULL,SEP));

        //如果是export 这种设置环境变量的东西需要特殊处理
        if(strcmp(cmd[0], "export") == 0 && cmd[1] != NULL)
        {
            strcpy(envp, cmd[1]);
            putenv(envp);
            continue;
        }

        //4 让父进程执行内置命令
        if(strcmp(cmd[0],"cd")==0)
        {
            if(cmd[1]!=NULL)
            {
                chdir(cmd[1]);
            }
        }
        
        //5 fork 让子进程执行代码
        pid_t id=fork();
        if(id==0)
        {
            //子进程 替换执行代码
            execvp(cmd[0],cmd);
            exit(1);
        }

        //父进程 等待回收子进程
        int status=0;
        pid_t ret = waitpid(id, &status, 0);
        if(ret > 0)
        {
            printf("exit code: %d\n", WEXITSTATUS(status));
        }
 
    }
    return 0;
}
